package cn.tedu._03vehicle.base.interceptors;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
public class RateLimitInterceptor implements HandlerInterceptor {

    private static final int MAX_REQUEST_PER_MINUTE = 3;
    private static final int WINDOW_SIZE_SECONDS = 60;

    //ip地址访问次数
    private ConcurrentHashMap<String,Integer> clientCounts = new ConcurrentHashMap<>();

    //ip地址最后的访问时间
    private ConcurrentHashMap<String, LocalDateTime> clientTimes = new ConcurrentHashMap<>();
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String addr = request.getRemoteAddr();
        LocalDateTime lastTime = clientTimes.get(addr);
        if (lastTime==null|| LocalDateTime.now().isAfter(lastTime.plusSeconds(WINDOW_SIZE_SECONDS))){
            clientCounts.put(addr,0);
            clientTimes.put(addr,LocalDateTime.now());
        }
        clientCounts.merge(addr,1,Integer::sum);
        if(clientCounts.get(addr)>MAX_REQUEST_PER_MINUTE){
            throw new RuntimeException("访问过于频繁，请稍后再试");
        }
        return true;
    }
}
